import { defineStore } from 'pinia';
import { eventBus } from '@/utils/eventBus';

/**
 * 用户设置接口
 */
export interface UserSettings {
  // 基础设置
  language: string;
  theme: 'light' | 'dark' | 'system';
  
  // 自动保存设置
  autoSave: boolean;
  autoSaveInterval: number; // 秒
  
  // 界面设置
  showTips: boolean;
  showWelcomeScreen: boolean;
  
  // 网格设置
  gridSize: number;
  snapToGrid: boolean;
  
  // 默认样式设置
  defaultFont: string;
  defaultFontSize: number;
  defaultColor: string;
  defaultStrokeColor: string;
  defaultStrokeWidth: number;
  defaultFillColor: string;
  defaultOpacity: number;
  
  // 键盘快捷键设置
  enableShortcuts: boolean;
  customShortcuts: Record<string, string>;
  
  // 性能设置
  highQualityRendering: boolean;
  maxUndoSteps: number;
}

/**
 * 默认设置
 */
const defaultSettings: UserSettings = {
  language: 'zh-CN',
  theme: 'system',
  
  autoSave: true,
  autoSaveInterval: 60,
  
  showTips: true,
  showWelcomeScreen: true,
  
  gridSize: 10,
  snapToGrid: true,
  
  defaultFont: 'Arial',
  defaultFontSize: 16,
  defaultColor: '#000000',
  defaultStrokeColor: '#000000',
  defaultStrokeWidth: 1,
  defaultFillColor: '#ffffff',
  defaultOpacity: 1,
  
  enableShortcuts: true,
  customShortcuts: {},
  
  highQualityRendering: true,
  maxUndoSteps: 50
};

/**
 * 设置存储
 */
export const useSettingsStore = defineStore('settings', {
  state: (): UserSettings => ({ ...defaultSettings }),
  
  getters: {
    /**
     * 获取当前主题
     */
    currentTheme(): 'light' | 'dark' {
      if (this.theme === 'system') {
        return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
      }
      return this.theme;
    },
    
    /**
     * 获取当前语言
     */
    currentLanguage(): string {
      return this.language;
    },
    
    /**
     * 获取默认文本样式
     */
    defaultTextStyle(): Record<string, any> {
      return {
        fontFamily: this.defaultFont,
        fontSize: this.defaultFontSize,
        fill: this.defaultColor,
        opacity: this.defaultOpacity
      };
    },
    
    /**
     * 获取默认形状样式
     */
    defaultShapeStyle(): Record<string, any> {
      return {
        stroke: this.defaultStrokeColor,
        strokeWidth: this.defaultStrokeWidth,
        fill: this.defaultFillColor,
        opacity: this.defaultOpacity
      };
    }
  },
  
  actions: {
    /**
     * 更新设置
     * @param settings 部分设置
     */
    updateSettings(settings: Partial<UserSettings>) {
      // 保存旧设置以便检测变化
      const oldSettings = { ...this.$state };
      
      // 更新设置
      Object.assign(this, settings);
      
      // 保存设置
      this.saveSettings();
      
      // 检测主题变化
      if (oldSettings.theme !== this.theme) {
        this.applyTheme();
      }
      
      // 检测语言变化
      if (oldSettings.language !== this.language) {
        this.applyLanguage();
      }
      
      // 检测历史记录步数变化
      if (oldSettings.maxUndoSteps !== this.maxUndoSteps) {
        eventBus.emit('settings:max-undo-steps-changed', { maxUndoSteps: this.maxUndoSteps });
      }
      
      // 发送设置更新事件
      eventBus.emit('settings:updated', { settings: this.$state });
    },
    
    /**
     * 保存设置到本地存储
     */
    saveSettings() {
      try {
        localStorage.setItem('svg-editor-settings', JSON.stringify(this.$state));
      } catch (error) {
        console.error('Failed to save settings:', error);
      }
    },
    
    /**
     * 从本地存储加载设置
     */
    loadSettings() {
      try {
        const savedSettings = localStorage.getItem('svg-editor-settings');
        if (savedSettings) {
          const settings = JSON.parse(savedSettings);
          this.updateSettings(settings);
        } else {
          // 如果没有保存的设置，应用默认设置
          this.applyTheme();
          this.applyLanguage();
        }
      } catch (error) {
        console.error('Failed to load settings:', error);
        // 出错时应用默认设置
        this.applyTheme();
        this.applyLanguage();
      }
    },
    
    /**
     * 重置设置为默认值
     */
    resetSettings() {
      this.$reset();
      this.saveSettings();
      this.applyTheme();
      this.applyLanguage();
      
      // 发送设置重置事件
      eventBus.emit('settings:reset');
    },
    
    /**
     * 应用主题
     */
    applyTheme() {
      const theme = this.currentTheme;
      document.documentElement.classList.remove('light-theme', 'dark-theme');
      document.documentElement.classList.add(`${theme}-theme`);
      
      // 发送主题变更事件
      eventBus.emit('settings:theme-changed', { theme });
    },
    
    /**
     * 应用语言
     */
    applyLanguage() {
      // 发送语言变更事件
      eventBus.emit('settings:language-changed', { language: this.language });
    },
    
    /**
     * 切换主题
     */
    toggleTheme() {
      const newTheme = this.theme === 'light' ? 'dark' : 'light';
      this.updateSettings({ theme: newTheme });
    },
    
    /**
     * 设置语言
     * @param language 语言代码
     */
    setLanguage(language: string) {
      this.updateSettings({ language });
    },
    
    /**
     * 设置网格大小
     * @param size 网格大小
     */
    setGridSize(size: number) {
      this.updateSettings({ gridSize: size });
    },
    
    /**
     * 切换网格吸附
     */
    toggleSnapToGrid() {
      this.updateSettings({ snapToGrid: !this.snapToGrid });
    },
    
    /**
     * 切换自动保存
     */
    toggleAutoSave() {
      this.updateSettings({ autoSave: !this.autoSave });
    },
    
    /**
     * 设置自动保存间隔
     * @param interval 间隔（秒）
     */
    setAutoSaveInterval(interval: number) {
      this.updateSettings({ autoSaveInterval: interval });
    },
    
    /**
     * 设置默认字体
     * @param font 字体名称
     */
    setDefaultFont(font: string) {
      this.updateSettings({ defaultFont: font });
    },
    
    /**
     * 设置默认字体大小
     * @param size 字体大小
     */
    setDefaultFontSize(size: number) {
      this.updateSettings({ defaultFontSize: size });
    },
    
    /**
     * 设置默认颜色
     * @param color 颜色值
     */
    setDefaultColor(color: string) {
      this.updateSettings({ defaultColor: color });
    },
    
    /**
     * 设置默认描边颜色
     * @param color 颜色值
     */
    setDefaultStrokeColor(color: string) {
      this.updateSettings({ defaultStrokeColor: color });
    },
    
    /**
     * 设置默认描边宽度
     * @param width 宽度值
     */
    setDefaultStrokeWidth(width: number) {
      this.updateSettings({ defaultStrokeWidth: width });
    },
    
    /**
     * 设置默认填充颜色
     * @param color 颜色值
     */
    setDefaultFillColor(color: string) {
      this.updateSettings({ defaultFillColor: color });
    },
    
    /**
     * 设置默认不透明度
     * @param opacity 不透明度值
     */
    setDefaultOpacity(opacity: number) {
      this.updateSettings({ defaultOpacity: opacity });
    },
    
    /**
     * 切换键盘快捷键
     */
    toggleShortcuts() {
      this.updateSettings({ enableShortcuts: !this.enableShortcuts });
    },
    
    /**
     * 设置自定义快捷键
     * @param action 操作名称
     * @param shortcut 快捷键
     */
    setCustomShortcut(action: string, shortcut: string) {
      const customShortcuts = { ...this.customShortcuts, [action]: shortcut };
      this.updateSettings({ customShortcuts });
    },
    
    /**
     * 重置自定义快捷键
     */
    resetCustomShortcuts() {
      this.updateSettings({ customShortcuts: {} });
    },
    
    /**
     * 切换高质量渲染
     */
    toggleHighQualityRendering() {
      this.updateSettings({ highQualityRendering: !this.highQualityRendering });
    },
    
    /**
     * 设置最大撤销步数
     * @param steps 步数
     */
    setMaxUndoSteps(steps: number) {
      this.updateSettings({ maxUndoSteps: steps });
    }
  }
});